interface Length {
  length: number; 
}
// function getType<T>(val: T): string {
//   return Object.prototype.toString.call(val).slice(8, -1);
// }
function getType1<Type>(val: Type): Type {  // 表示 Type 类型可以是任意类型，但是在使用时必须指定类型，否则会报错
  console.log(val);
  return val;
}
function getType2<Type extends Length>(val: Type): Type {  // extends 表示 Type 类型必须是 Length 类型的子类型，即 Type 类型必须有 length 属性
  console.log(val.length);
  return val;
}
function getType3<Type , Key extends keyof Type>(obj: Type,key:Key){ // keyof Type 表示 Type 类型的所有公共属性的联合类型
  console.log(obj);
  return obj[key];
}  
console.log(getType3({name:'jack',age:18},'name'));
console.log(getType2('hello,world')); 
console.log(getType2([1, 2, 3]));
console.log(getType2({ length: 10 }));
console.log(getType2({length:40,gender:'男'}));
console.log(getType1<string>('1')); // '1'
// console.log(getType('1')); // 'String'    slice(8, -1)  从第8个字符开始，到倒数第1个字符结束
// console.log(getType(1)) ; // 'Number'